#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
struct DSU {
    vector<int> parent, size;
    DSU(int n) {
        parent.resize(n + 1);
        size.resize(n + 1, 1);
        for(int i = 0; i <= n; i++) {
            parent[i] = i;
        }
    }
    int find(int x) {
        if(parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }
    void unite(int x, int y) {
        int fx = find(x), fy = find(y);
        if(fx == fy) {
            return;
        }
        if(size[fx] < size[fy]) {
            swap(fx, fy);
        }
        parent[fy] = fx;
        size[fx] += size[fy];
    }
    bool same(int x, int y) {
        return find(x) == find(y);
    }
};
int main() {
    int n, m;
    cin >> n >> m;
    DSU a(n + 1);
    DSU b(n + 1);
    int count = 0;
    unordered_map<int, int> h;
    for(int i = 0; i < m; i++) {
        char c;
        int p, q;
        cin >> c >> p >> q;
        if(c == 'F') {
            a.unite(p, q);
        }else {
            if(!h[p]) {
                h[p] = q;
            }else {
                a.unite(h[p], q);
            }
            if(!h[q]) {
                h[q] = p;
            }else {
               a.unite(h[q], p); 
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        if(b.parent[i] != i) {
            if(!h[b.parent[i]]) {
                h[b.parent[i]] = i;
            }else {
                a.unite(h[b.parent[i]], i);
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        if(a.parent[i] != i) {
            count++;
        }
    }
    cout << n - count << endl;
    return 0;
}